import axios from 'axios';
import { getToken } from '@/utils/storage';
import history from './history';
import { Toast } from 'antd-mobile';
import store from '@/store';
import { setToken, removeToken } from './storage';
import { LocationStateType } from '@/components/AuthRoute';

// 请求基地址
export const baseURL = 'http://geek.itheima.net';

// 创建axios实例
const http = axios.create({
  baseURL: baseURL,
  timeout: 5000,
});

// 请求拦截器
http.interceptors.request.use(
  function (config: any) {
    const { token } = getToken();
    if (token)
      // console.log(15, config);
      config.headers.Authorization = `Bearer ${token}`;

    return config;
  },
  function (error) {
    return Promise.reject(error);
  }
);

// 响应拦截器
http.interceptors.response.use(
  function (response) {
    // console.log(33, response);

    return response.data;
  },
  async function (error) {
    // 获取错误信息中包含的i请求配置信息和响应数据
    const { config, response } = error;
    //1. 如果因为网络原因，没有response，则给小消息提示
    if (!error.response) {
      Toast.show({
        content: '网络繁忙，请稍后重试',
      });
      return Promise.reject(error);
    }

    // 2.网络没问题，后台返回数据(可能是404，400这些请求参数。请求地址的错误),
    if (response.status !== 401) {
      // console.log(63, error.response);
      Toast.show({
        content: response.data.message,
      });
      return Promise.reject(error);
    }

    //3. 判断请求响应的状态码，即token不正确造成的授权问题
    // 是401错误，没有刷新token问题
    const { token, refresh_token } = getToken();
    if (response.status === 401) {
      // 如果没有token或者refresh_token，跳转到登录页，并且带上当前要访问的页面
      if (!token || !refresh_token) {
        history.replace('/login', {
          from: history.location.pathname || '/home',
        });
        return Promise.reject(error);
      }
    }
    // return Promise.reject(error);

    // 4.是401错误，且有刷新token，（token失效）用刷新token去换取新的token
    // 特别说明：这个地方发请求的时候，不能使用新建的http实例去请求，要用默认实例axios去请求
    // 否则会因为http的请求拦截，携带上老的token，而不是刷新token
    try {
      const res = await axios({
        // const res = axios({
        method: 'put',
        url: baseURL + '/v1_0/authorizations',
        // url: `${baseURL}/v1_0/authorizations`,
        headers: {
          Authorization: 'Bearer ' + refresh_token,
          // 'Content-Type': 'application/x-www-form-urlencoded',
          // Authorization: `Bearer ${refresh_token}`,
        },
      });
      console.log(82, 'token失效的拦截', res);

      // 刷新成功，将新token保存
      const newToken = {
        token: res.data.data.token,
        refresh_token: refresh_token,
      };
      // console.log(93, newToken);
      // 将token保存在redux
      store.dispatch({ type: 'user/getToken', payload: newToken });
      // 保存再本地
      setToken(newToken);

      // token刷新成功后，
      return http(config);
    } catch {
      // 刷新token失败，刷新token过期
      removeToken();
      // 跳转到登录页面
      // history.replace('/login',{
      //   from:history.location.pathname,
      // })
      history.push('/login', {
        from: history.location.pathname,
      } as LocationStateType);
      Toast.show({
        content: '登录信息失效，请重新登录',
      });
      return Promise.reject(error);
    }
  }
);

// 导出axios实例
export default http;
